
#将之前封装的MyMath类中的实例方法改为静态方法, 体会两者的区别.
'''
实例方法：先声明一个实例用于继承父类，再通过实例调用父类的方法
静态方法：通过@staticmethod装饰器，可以直接调用类方法
'''
class MyMath_1:
    #实例方法
    def add_1(self,a,b):
        return a+b
    #静态方法
    @staticmethod
    def add(a,b):
        return a+b

    @staticmethod
    def sub(a,b):
        return a-b

    @staticmethod
    def mul(a,b):
        return a*b

    @staticmethod
    def div(a,b):
        return a/b

m_1=MyMath_1()
print('实例方法',m_1.add_1(1,2))

print('静态方法',MyMath_1.add(1,2))
print('静态方法',MyMath_1.sub(1,2))
print('静态方法',MyMath_1.mul(1,2))
print('静态方法',MyMath_1.div(1,2))

print('-----------------1--------------------')

#为上节课自定义类添加以下功能
'''
一：添加类属性
二：添加类私有属性
三：添加类方法或者类的私有属性
四：在__init__方法中初始化实例属性
五：在__init__方法中绑定私有实例属性
六：在自定义类中实现__str__, 自定义输出格式
'''
class Door():

    #一：添加类属性
    UsedFor='我可以防盗'
    other=None

    #二：添加类私有属性,不希望外部更改, 只作用于类内部,通过类._类名__变量名来访问私有属性
    __notes='屋里有私人物品，请慎重'

    #三：添加类方法或者类的私有属性
    #实验发现，当类方法名（不）为__new__时，创建实例时（不）会自动调用类方法
    @classmethod
    def __new__(cls, *args, **kwargs):
        print('这是一个类方法')
        return super().__new__(cls)
    #  类方法可以通过  实例名.类名.私有属性名  调用类的私有属性
    def new_1(cls):
        return Door.__notes

    #四：在__init__方法中初始化实例属性
    #五：在__init__方法中绑定私有实例属性，实例的自有属性
    def __init__(self,special):
        self.special='我的特点是：'+special



d_1=Door('0')
print(d_1.new_1())
print('--------------------------------------')

wooden_door=Door("便宜")
print('我是木屋,'+wooden_door.special)
print('--------------------------------------')

wooden_door=Door('other')
wooden_door.other='木屋.other'
glass_door=Door('other')
glass_door.other='玻璃门.other'
print(wooden_door.other)
print(glass_door.other)
print('--------------------------------------')

# 六：在自定义类中实现__str__, 自定义输出格式
class Test(list):
    def __str__(self):
        print()
        return f'这个list长度为：{len(self)}'
test=Test(['1','2','3','4'])
print(test)